package com.chen.base.utils;

import org.springframework.context.ApplicationContext;

import java.io.BufferedInputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;

/**
 * 配置工具类
 * @author: Long
 * @date: 2023/8/20 14:08
 **/
public class PropertyUtil {

    /**
     * 读取外部配置文件的配置信息
     * @param key 参数key
     * @param propertiesFilePath properties文件路径
     * @return 配置信息
     */
    public static String getExProperty(String key, String propertiesFilePath){
        return getExProperty(key,null,propertiesFilePath);
    }

    /**
     * 读取外部配置文件的配置信息
     * @param key 参数key
     * @param defaultValue 默认值，如key不存在，则返回该值
     * @param propertiesFilePath properties文件路径
     * @return 配置信息
     */
    public static String getExProperty(String key, String defaultValue, String propertiesFilePath){
        Properties properties = readExternalProperties(propertiesFilePath);
        return properties.getProperty(key,defaultValue);
    }

    /**
     * 读取外部配置文件
     * todo 注：不支持yml文件
     * @param propertiesFilePath properties配置文件路径
     * @return Properties
     */
    public static Properties readExternalProperties(String propertiesFilePath){
        Properties pps = new Properties();
        try (InputStreamReader isr = new InputStreamReader(
                new BufferedInputStream(Files.newInputStream(Paths.get(propertiesFilePath))),
                StandardCharsets.UTF_8)){

            pps.load(isr);
        }catch (Exception e){
            e.printStackTrace();
        }
        return pps;
    }

    /**
     * 获取配置文件中的配置
     * @param key 参数key
     * @return 配置
     */
    public static String getProperty(String key){
        return getProperty(key, String.class);
    }

    /**
     * 获取配置文件中的配置
     * @param key 参数key
     * @param targetType 返回值类型的类对象
     * @return 配置
     */
    public static <T> T getProperty(String key, Class<T> targetType){
        return getProperty(key, targetType, null);
    }

    /**
     * 获取配置文件中的配置
     * @param key 参数key
     * @param targetType 返回值类型的类对象
     * @param defaultValue 默认值
     * @return 配置
     */
    public static <T> T getProperty(String key, Class<T> targetType, T defaultValue){
        ApplicationContext appContext = SpringContextHolder.getAppContext();
        return appContext.getEnvironment().getProperty(key, targetType, defaultValue);
    }
}
